import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import optuna
from qiskit.utils import QuantumInstance
from qiskit_optimization.algorithms import WarmStartQAOAOptimizer, CobylaOptimizer
from qiskit.algorithms import QAOA
from shared.graph_helper import *
from shared.QiskitMaxcut import *
from ionq.ionq_parameters import *
%matplotlib inline
# ---- Define graph and MaxCut ----
graph = generate_butterfly_graph(with_weights=True)
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=simulator_backend,
shots=SHOTS)
qaoa = QAOA(optimizer=optimizer, quantum_instance=quantum_instance, reps=reps,
initial_point=init_parameters)
ws_qaoa = WarmStartQAOAOptimizer(pre_solver=CobylaOptimizer(), relax_for_pre_solver=True,
qaoa=qaoa)
return ws_qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
result = qaoa.solve(max_cut_problem)
optimal_parameters = qaoa._qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX + 1)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-07-28 21:07:47,550] A new study created in memory with name: no-name-c6f1b012-0a74-4acd-b182-4e4fbdd9959a [I 2021-07-28 21:14:29,481] Trial 0 finished with value: -24.506 and parameters: {'optimizer': 'SPSA', 'reps': 1, 'gamma_0': -2.0491905449396115, 'beta_0': -1.7802310421072518}. Best is trial 0 with value: -24.506. [I 2021-07-28 21:21:07,378] Trial 1 finished with value: -25.171 and parameters: {'optimizer': 'SPSA', 'reps': 8, 'gamma_0': -0.4888573075009246, 'gamma_1': 0.0025953618421517, 'gamma_2': 1.2779818487500592, 'gamma_3': -2.527774518975148, 'gamma_4': 1.8538641160827893, 'gamma_5': 0.5326028598722021, 'gamma_6': 1.7274965144606398, 'gamma_7': 3.0565505362110352, 'beta_0': 0.9508688763725379, 'beta_1': 1.8754454027687668, 'beta_2': -2.737240123335577, 'beta_3': -0.17194768926586823, 'beta_4': -0.054238022929710805, 'beta_5': -2.45114990105841, 'beta_6': -2.778236520009275, 'beta_7': -0.26267142344728356}. Best is trial 1 with value: -25.171. [I 2021-07-28 21:27:46,385] Trial 2 finished with value: -24.589 and parameters: {'optimizer': 'SPSA', 'reps': 6, 'gamma_0': 0.12532272213969886, 'gamma_1': -1.4803407296687037, 'gamma_2': -2.7203461683269015, 'gamma_3': 1.5011084529070464, 'gamma_4': 0.3290791335981642, 'gamma_5': -1.4670845431525303, 'beta_0': -0.05295335768382525, 'beta_1': 1.2991234890047716, 'beta_2': -1.3184219323269977, 'beta_3': 1.3181729954359653, 'beta_4': 0.3855548586327888, 'beta_5': 0.9753011229218407}. Best is trial 1 with value: -25.171. [I 2021-07-28 21:28:24,698] Trial 3 finished with value: -27.454999999999995 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 2.7290333236617563, 'gamma_1': 0.08132862700611598, 'gamma_2': -2.4336722839654543, 'gamma_3': 2.629384434842456, 'gamma_4': 1.7715943196804602, 'beta_0': -0.26943281793763285, 'beta_1': 0.7627935066755991, 'beta_2': 2.6893535786347735, 'beta_3': -3.0145652018162075, 'beta_4': -2.8408295988661396}. Best is trial 3 with value: -27.454999999999995. [I 2021-07-28 21:29:03,281] Trial 4 finished with value: -26.002000000000002 and parameters: {'optimizer': 'COBYLA', 'reps': 1, 'gamma_0': -2.009813414495259, 'beta_0': 1.6934311671585025}. Best is trial 3 with value: -27.454999999999995.
print(study.best_trial)
FrozenTrial(number=3, values=[-27.454999999999995], datetime_start=datetime.datetime(2021, 7, 28, 21, 27, 46, 389588), datetime_complete=datetime.datetime(2021, 7, 28, 21, 28, 24, 696596), params={'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 2.7290333236617563, 'gamma_1': 0.08132862700611598, 'gamma_2': -2.4336722839654543, 'gamma_3': 2.629384434842456, 'gamma_4': 1.7715943196804602, 'beta_0': -0.26943281793763285, 'beta_1': 0.7627935066755991, 'beta_2': 2.6893535786347735, 'beta_3': -3.0145652018162075, 'beta_4': -2.8408295988661396}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=11, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-27.454999999999995, optimal function value: -35.0
optimal value: [0. 1. 0. 1. 0.]
status: SUCCESS, array([ 2.72903332, 0.08132863, -2.43367228, 2.62938443, 1.77159432,
-0.26943282, 0.76279351, 2.68935358, -3.0145652 , -2.8408296 ])]}, system_attrs={}, intermediate_values={}, trial_id=3, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params = study.user_attrs["best"]
optimal_params
array([ 2.72903332, 0.08132863, -2.43367228, 2.62938443, 1.77159432,
-0.26943282, 0.76279351, 2.68935358, -3.0145652 , -2.8408296 ])
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
plot_histogram(distribution, color='midnightblue', title=f"Expectation Value (Ø: {mean:.3f})")
optimal function value: -35.0 optimal value: [0. 1. 0. 1. 0.] status: SUCCESS Mean: -27.454999999999995 00000: value: 0.000, probability: 0.2% 11111: value: 0.000, probability: 0.2% 10010: value: -13.000, probability: 1.1% 01101: value: -13.000, probability: 4.2% 10000: value: -15.000, probability: 0.6% 01111: value: -15.000, probability: 0.2% 00100: value: -16.000, probability: 4.3% 00010: value: -16.000, probability: 6.1% 11101: value: -16.000, probability: 0.6% 11011: value: -16.000, probability: 3.1% 10011: value: -17.000, probability: 0.5% 01000: value: -19.000, probability: 0.7% 10111: value: -19.000, probability: 1.7% 10110: value: -29.000, probability: 6.3% 01001: value: -29.000, probability: 14.2% 11110: value: -30.000, probability: 0.4% 00001: value: -30.000, probability: 10.0% 10100: value: -31.000, probability: 6.9% 01011: value: -31.000, probability: 0.2% 11010: value: -32.000, probability: 0.1% 00110: value: -32.000, probability: 21.4% 11001: value: -32.000, probability: 2.9% 00101: value: -32.000, probability: 1.3% 01110: value: -33.000, probability: 1.7% 10001: value: -33.000, probability: 2.0% 00111: value: -34.000, probability: 4.7% 01010: value: -35.000, probability: 0.3% 10101: value: -35.000, probability: 4.1%
import qiskit.tools.jupyter
%qiskit_version_table
| Qiskit Software | Version |
|---|---|
| Qiskit | 0.27.0 |
| Terra | 0.17.4 |
| Aer | 0.8.2 |
| Ignis | 0.6.0 |
| Aqua | 0.9.2 |
| IBM Q Provider | 0.14.0 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Wed Jul 28 21:29:03 2021 CEST | |